package com.yunduansing.core.utils;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * 文件上传工具类
 * @author yunduansing
 *
 */
public class FileUtil {
	/**
	 * 单文件上传
	 * 默认文件上传路径为：/upload
	 * 可以通过指定path参数指定上传路径
	 * @param file 要上传的文件
	 * @param path 要保存的路径
	 * @param old 旧文件路径，若存在的话，则会删除此旧文件
	 * @return 若上传成功则返回工具ResultUtil的data属性会包含保存路径
	 */
	public static ResultUtil upload(File file,String path,String old){
		try{
			if(path.isEmpty())
				path="/upload/";
			if(!old.isEmpty())
				delete(old);
		    File dir=new File(path);
			if(!dir.exists())
				dir.mkdirs();
			String filepath=path+UUID.randomUUID().toString()+file.getName();
			return ResultUtil.init(true,"上传成功",filepath);
		}catch(Exception e){
			return ResultUtil.init(e);
		}
	}
	/**
	 * 多文件上传
	 * 默认文件上传路径为：/upload
	 * 可以通过指定path参数指定上传路径
	 * @param files 要上传的文件列表
	 * @param path 要保存的路径
	 * @param old 旧文件路径，若存在的话，则会删除此旧文件
	 * @return
	 */
	public static ResultUtil upload(List<File> files,String path,String old){
		try{
			if(path.isEmpty())
				path="/upload/";
			if(!old.isEmpty())
				delete(old);
		    File dir=new File(path);
			if(!dir.exists())
				dir.mkdirs();
			List<String> list=new ArrayList<String>();
			for(File item:files){
				String filepath=path+UUID.randomUUID().toString()+item.getName();
				list.add(filepath);
			}
			return ResultUtil.init(true,"上传成功");
		}catch(Exception e){
			return ResultUtil.init(e);
		}
	}
	/**
	 * 根据文件路径删除文件
	 * @param path 待删除的文件路径
	 * @return
	 */
	public static ResultUtil delete(String path){
		try{
			File file=new File(path);
			if(file.exists()&&file.isFile())
				file.delete();
			return ResultUtil.init();
		}catch(Exception e){
			return ResultUtil.init(e);
		}
	}
	/**
	 * 根据文件对象删除文件
	 * @param file 待删除的文件对象
	 * @return
	 */
	public static ResultUtil delete(File file){
		try{
			if(file.exists()&&file.isFile())
				file.delete();
			return ResultUtil.init();
		}catch(Exception e){
			return ResultUtil.init(e);
		}
	}
	/**
	 * 通过FileInputStream读取文件到byte数组中
	 * @param file 要读取的文件对象
	 * @return
	 */
	public static ResultUtil read(File file){
		try{
			if(!file.exists())
				return ResultUtil.init(false,"文件不存在");
			if(!file.isFile())
				return ResultUtil.init(false,"请确保您要读取的是文件");
			if(file.length()>Integer.MAX_VALUE)
				return ResultUtil.init(false,"文件太大了");
			byte[] buffer=new byte[(int) file.length()];
			FileInputStream reader=new FileInputStream(file);
			int offset=0;
			int len=0;
			while((len=reader.read(buffer, offset, buffer.length-offset))!=-1){
				offset+=len;
			}
			if(offset!=buffer.length)
				return ResultUtil.init(false,"发生异常，文件没有读完"+file.getName());
			reader.close();
			return ResultUtil.init(true,"读取成功",buffer);
		}catch(Exception e){
			return ResultUtil.init(e);
		}
	}
}
